/**
 * 装饰器管理器
 */
import * as vscode from 'vscode';
import { ExtensionConfig } from './types';
import { Logger } from './logger';

/**
 * 装饰器管理器类
 */
export class DecorationManager {
    private decorationType: vscode.TextEditorDecorationType | undefined;
    private readonly logger: Logger;

    constructor() {
        this.logger = Logger.getInstance();
    }

    /**
     * 更新装饰器样式
     */
    public updateDecorationStyle(config: ExtensionConfig): void {
        // 清理旧的装饰器
        if (this.decorationType) {
            this.decorationType.dispose();
        }

        // 创建新的装饰器
        this.decorationType = vscode.window.createTextEditorDecorationType({
            opacity: config.opacity.toString(),
            // 添加更多视觉提示
            textDecoration: 'none'
            // 可选：添加边框或背景色
            // border: '1px solid rgba(255, 165, 0, 0.3)',
            // backgroundColor: 'rgba(255, 165, 0, 0.1)'
            // 移除 after 配置以避免多余的空格
        });

        this.logger.debug(`装饰器样式已更新，透明度: ${config.opacity}`);
    }

    /**
     * 应用装饰到编辑器
     */
    public applyDecorations(editor: vscode.TextEditor, ranges: vscode.Range[]): void {
        if (!this.decorationType) {
            this.logger.warn('装饰器类型未初始化');
            return;
        }

        try {
            // 创建装饰选项，包含悬停信息
            const decorationOptions: vscode.DecorationOptions[] = ranges.map(range => ({
                range,
                hoverMessage: new vscode.MarkdownString(
                    '**零引用函数** 🚫\n\n' +
                    '此函数在当前工作区中没有被引用，可能是未使用的代码。\n\n' +
                    '💡 *提示：如果确认不需要此函数，可以考虑删除以保持代码整洁。*'
                )
            }));

            editor.setDecorations(this.decorationType, decorationOptions);
            this.logger.debug(`已应用 ${ranges.length} 个装饰到编辑器`);

        } catch (error) {
            this.logger.error('应用装饰失败', error instanceof Error ? error : undefined);
        }
    }

    /**
     * 清除编辑器的装饰
     */
    public clearDecorations(editor: vscode.TextEditor): void {
        if (!this.decorationType) {
            return;
        }

        try {
            editor.setDecorations(this.decorationType, []);
            this.logger.debug('已清除编辑器装饰');
        } catch (error) {
            this.logger.error('清除装饰失败', error instanceof Error ? error : undefined);
        }
    }

    /**
     * 清除所有编辑器的装饰
     */
    public clearAllDecorations(): void {
        if (!this.decorationType) {
            return;
        }

        try {
            // 清除所有可见编辑器的装饰
            vscode.window.visibleTextEditors.forEach(editor => {
                this.clearDecorations(editor);
            });

            this.logger.debug('已清除所有编辑器装饰');
        } catch (error) {
            this.logger.error('清除所有装饰失败', error instanceof Error ? error : undefined);
        }
    }

    /**
     * 释放资源
     */
    public dispose(): void {
        if (this.decorationType) {
            this.decorationType.dispose();
            this.decorationType = undefined;
            this.logger.debug('装饰器管理器已释放');
        }
    }

    /**
     * 检查装饰器是否已初始化
     */
    public isInitialized(): boolean {
        return this.decorationType !== undefined;
    }
}